package com.thzy.bbs.common;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * JSON工具类
 * 帮助转换Map，动态添加字段。
 *
 * @author marker
 * @version 1.0
 * @date 2016/05/06 17:43
 */
public class JSONUtils {

    /**
     * 空的JSONObject, JSONArray
     */
    public static final JSONObject EMPTY_OBJECT = new JSONObject();
    public static final JSONArray EMPTRY_ARRAY = new JSONArray();


    /**
     * 转换JSON对象
     *
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> T toJSONObject(Object obj) {
        if (null == obj) {
            return null;
        }
        if (isBaseDataType(obj.getClass())) {
            return null;
        }
        return (T) JSON.toJSON(obj);
    }


    /**
     * 移除给定的JSONObject中值为null的entry
     *
     * @param json
     * @return void
     * @author Jerry.X.He
     */
    public static void removeIfNull(JSONObject json) {
        List<String> needToRemove = new ArrayList<>(json.size() >> 1);
        for (Map.Entry<String, Object> entry : json.entrySet()) {
            if (entry.getValue() == null) {
                needToRemove.add(entry.getKey());
            }
        }
        for (String key : needToRemove) {
            json.remove(key);
        }
    }


    /**
     * 判断一个类是否为基本数据类型。
     *
     * @param clazz 要判断的类。
     * @return true 表示为基本数据类型。
     */
    private static boolean isBaseDataType(Class clazz) {
        return
                (
                        clazz.equals(String.class) ||
                                clazz.equals(Integer.class) ||
                                clazz.equals(Byte.class) ||
                                clazz.equals(Long.class) ||
                                clazz.equals(Double.class) ||
                                clazz.equals(Float.class) ||
                                clazz.equals(Character.class) ||
                                clazz.equals(Short.class) ||
                                clazz.equals(BigDecimal.class) ||
                                clazz.equals(BigInteger.class) ||
                                clazz.equals(Boolean.class) ||
                                clazz.equals(Date.class) ||
                                clazz.isPrimitive()
                );
    }
}
